import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig, AxiosRequestConfig } from 'axios';
import { ElMessage } from 'element-plus';
import { getMessageInfo } from './status';
import { BaseResponse } from './types';
const service = axios.create({
    //这样我们就可以在环境变量中改变 axios 的 baseURL
    // 启用 mock 就请求 mock 路径
    // 不启用 mock 就请求 正常后端路径
    baseURL: import.meta.env.VITE_APP_USE_MOCK
        ? import.meta.env.VITE_APP_MOCK_BASEURL
        : import.meta.env.VITE_APP_API_BASEURL,
    timeout: 15000
});

// axios 实例拦截器请求
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        return config;
    },
    (error: AxiosError) => {
        return Promise.reject(error);
    }
);
//axios 实例拦截器响应
//给予用户友好提示
service.interceptors.response.use(
    (response: AxiosResponse) => {
        if (response.status === 200) {
            const data = response.data;
            if (data.code !== 0) {
                ElMessage.error(getMessageInfo(data.code));
                return Promise.reject(data);
            } else {
                return data.data;
            }
        }
        ElMessage.error(getMessageInfo(response.status));
        return response.data;
    },
    //请求失败
    (error: any) => {
        const { response } = error;
        if (response) {
            // 请求已发出，但是不在2xx的范围
            ElMessage.error(getMessageInfo(response.status));
            return Promise.reject(response.data);
        }
        ElMessage.error('网络连接异常，请稍后再试！');
    }
);
// BaseResponse 为 res.data 的类型
// T 为 res.data.data 的类型 不同的接口会返回不同的 data 所以我们加一个泛型表示
// 此处相当于二次响应拦截
// 为响应数据进行定制化处理
// export const requestInstance = <T = any>(config: AxiosRequestConfig): Promise<T> => {
//     const conf = config;
//     return new Promise((resolve, reject) => {
//         service.request<any, AxiosResponse<BaseResponse>>(conf).then((res: AxiosResponse<BaseResponse>) => {
//             const data = res.data;
//             // 如果data.code为错误代码返回message信息
//             if (data.code != 0) {
//                 ElMessage.error(data.message);
//                 reject(data.message);
//             } else {
//                 ElMessage.success(data.message);
//                 // 此处返回data信息 也就是 api 中配置好的 Response类型
//                 resolve(data.data as T);
//             }
//         });
//     });
// };
export default service;
